﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TetComp;

namespace EyeTracker_IA_Project
{
    /// <summary>
    /// Contiene i valori X e Y appena letti.
    /// </summary>
    class ValoreObject
        {
            private float xVal, yVal;

            public ValoreObject() 
            {
                xVal=0F;
                yVal=0F;
            }
            
            public void setVal(float xVal, float yVal)
            {
                this.xVal=xVal;
                this.yVal=yVal;
            }

            public int getXVal()
            {
                return (int)Math.Floor(xVal);
            }

            public int getYVal()
            {
                return (int)Math.Floor(yVal);
            }
        }

    /// <summary>
    /// Basandosi sugli eventi generati dall'EyeTracker, controlla la validità delle misurazioni per occhio, fa la media e scrive il valore in un oggetto.
    /// </summary>
    class ListenerEyeTracker
    {
        volatile private ValoreObject valoreDaPassare = new ValoreObject();

        volatile private Boolean toStop = false;

        public void listener()
        {
            while (!(toStop))
            {
            }
        }

        private void tetClientEvents_OnGazeData(ref TetGazeData gazeData)
        {

            float x, y;
            bool valid = true;

            // Controlla se almeno un occhio è stato riconosciuto valido
            if (gazeData.validity_lefteye == 0 || gazeData.validity_righteye == 0)
            {
                // Solo il sinistro
                if (gazeData.validity_lefteye == 0 && gazeData.validity_righteye != 0)
                {
                    x = gazeData.x_gazepos_lefteye;
                    y = gazeData.y_gazepos_lefteye;
                }
                // Solo il destro
                else if (gazeData.validity_lefteye != 0 && gazeData.validity_righteye == 0)
                {
                    x = gazeData.x_gazepos_righteye;
                    y = gazeData.y_gazepos_righteye;
                }
                // Tutti e due
                else if (gazeData.validity_lefteye == 0 && gazeData.validity_righteye == 0)
                {
                    x = (gazeData.x_gazepos_lefteye + gazeData.x_gazepos_righteye) / 2;
                    y = (gazeData.y_gazepos_lefteye + gazeData.y_gazepos_righteye) / 2;
                }
                else
                {
                    valid = false;
                    x = y = 0.0F;
                }
                if (valid)
                {
                    lock (valoreDaPassare)
                    {
                        valoreDaPassare.setVal(x, y);
                    }
                }
            }
        }

        /// <summary>
        /// Ritorna il valore X e Y, in oggetto
        /// </summary>
        /// <returns>Oggetto ValoreObject</returns>
        public ValoreObject getVal()
        {
            lock (valoreDaPassare)
            {
                return valoreDaPassare;
            }
        }

        public void requestStop()
        {
            toStop = true;
        }
    }
}
